home *** CD-ROM | disk | FTP | other *** search
- {
- > I'm currently working on a small program for a Turbo Pascal class
- > I am taking. The assignment is to write a program that solves a system
- > of equations via Cramer's Rule. For example:
- >
- > 4x - 3y + 9z = 21
- > 5x - 43y - 3z = 45
- > 34x - 394y + 32z = 9
- >
- > and then find values for x, y, and z.
- >
- > Now this is no problem: I simply get input into a 3 x 4 array, which
- > would look like this for the sample above:
- >
- > 4 -3 9 21
- > 5 -43 -3 45
- > 34 -394 32 9
- >
- > The problem I am having is getting this input from the user. Now I
- > have thought of a few ways to accomplish this, namely:
- >
- > (1) Ask the user to enter the coefficients and the answer on a line and
- > hit return, and do this for each equation--this method allows me to put the
- > data directly into the array.
- >
- > (2) Give a rigid example of how and where to enter the equation, for
- > example #####x(sign)#####y(sign)#####z = #####
- > so I know where to read for the values to put into the array.
- >
- > (3) Possibly use the Val procedure and ask the user to input all number
- > as in #1, but separate the numbers with dashes.
- >
- > (4) Possibly convert string values to their ascii equivalent, and see if
- > they are numbers, turning non numbers into spaces.
- >
- > But, what I would rather do is to prompt the user for the whole equation
- > and have him/her type it out naturally and then pick the numbers out of
- > it to put into the 3x4 array. Example:
- >
- > Enter equation #1:
- > 3x + 4y - 8z = 45
- > ...
- >
- > This would seem to require storing the input as a string, and as far
- > as I know, you can't pick values of a string (except in a limited sense
- > with the Val function as touched upon above). But I think that it has
- > to be possible for me to process a naturally typed out equation! And I
- > would appreciate pointers to that effect.
-
- The following code, written in Turbo Pascal 6, should do what you
- want. You may want to test it more thoroughly than I did, and tidy up
- the code a bit. It checks for validity of input. Values are stored as
- reals.
-
- It reads in the equation, and puts the values into the global array
- eq_array.
- }
-
- program input_equations(input, output);
-
- type
- eq_string = string[40];
-
- var
- instr :eq_string;
- eq_array :array [1..3, 1..4] of real;
- eq_num :byte;
- x, y, z, answer :real;
- eq_ok :boolean;
-
-
- procedure prepare_equation_string (var s :eq_string);
- { Removes spaces and converts all letter to upper case }
- var
- tempstr :eq_string;
- n :byte;
- begin
- tempstr := '';
- for n := 1 to length(s) do
- if s[n] <> ' ' then tempstr := tempstr + upcase(s[n]);
- s := tempstr
- end;
-
- function get_arguments (s :eq_string; var a1, a2, a3 :eq_string) :boolean;
- { Splits equation into argument.
- eg, if s='3X+4Y-Z', then a1='3X', a2='+4Y', a3='-Z'.
-
- If any argument is blank, or there are more than 3 arguments,
- returns FALSE, otherwise returns TRUE }
-
- function next_arg (s :eq_string) :eq_string;
- var
- n :byte;
- begin
- n := 2;
- while (n <= length(s)) and not (s[n] in ['+', '-']) do
- inc (n);
- next_arg := copy (s, 1, n-1);
- end;
-
- begin
- a1 := next_arg (s);
- delete (s, 1, length(a1));
- a2 := next_arg (s);
- delete (s, 1, length(a2));
- a3 := next_arg (s);
- delete (s, 1, length(a3));
- get_arguments := ((length(a1)*length(a2)*length(a3)) > 0) and
- (s = '')
- end;
-
- function assign_values (var x, y, z :real; a1, a2, a3 :eq_string) :boolean;
- var
- x_assigned, y_assigned, z_assigned, ok_so_far :boolean;
-
- function assign_value (s :eq_string) :boolean;
- var
- id :char;
- value :real;
- resultcode :integer;
- ok :boolean;
- begin
- id := s[length(s)];
- delete (s, length(s), 1);
- if (s = '') or (s = '+') then
- s := '1';
- if s = '-' then
- s := '-1';
- val (s, value, resultcode);
- ok := (resultcode = 0);
- case id of
- 'X' : begin
- x := value;
- x_assigned := true
- end;
- 'Y' : begin
- y := value;
- y_assigned := true
- end;
- 'Z' : begin
- z := value;
- z_assigned := true
- end
- else
- ok := false
- end;
- assign_value := ok
- end;
-
- begin
- x_assigned := false;
- y_assigned := false;
- z_assigned := false;
- ok_so_far := assign_value (a1);
- ok_so_far := ok_so_far and assign_value (a2);
- ok_so_far := ok_so_far and assign_value (a3);
- assign_values := ok_so_far and x_assigned and y_assigned and z_assigned;
- end;
-
- function extract_values(s : eq_string; var x, y, z, ans : real) : boolean;
- var
- ok_so_far : boolean;
- n : byte;
- lhs, rhs,
- a1, a2, a3 : eq_string;
- resultcode : integer;
-
- begin
- ok_so_far := true;
- prepare_equation_string(s);
- n := pos ('=', s);
- if n = 0 then
- ok_so_far := false { No = in equation }
- else
- begin
- rhs := copy (s, n+1, length(s)-n);
- if pos ('=', rhs) > 0 then
- ok_so_far := false { More than one = in equation }
- else
- begin
- lhs := copy (s, 1, n-1);
- if (lhs = '') or (rhs = '') then
- ok_so_far := false { At least one side of equation }
- else { is blank }
- begin
- ok_so_far := get_arguments (lhs, a1, a2, a3);
- ok_so_far := ok_so_far and assign_values (x, y, z, a1, a2, a3);
- val (rhs, ans, resultcode);
- ok_so_far := ok_so_far and (resultcode = 0)
- end;
- end;
- end;
- extract_values := ok_so_far;
- end;
-
- begin
- for eq_num := 1 to 3 do
- begin
- repeat
- write ('Equation ', eq_num, ': ');
- readln (instr);
- eq_ok := extract_values (instr, x, y, z, answer);
- if not eq_ok then
- writeln ('Equation not in suitable format, try again');
- until eq_ok;
- eq_array [eq_num, 1] := x;
- eq_array [eq_num, 2] := y;
- eq_array [eq_num, 3] := z;
- eq_array [eq_num, 4] := answer;
- end;
- end.
-